
export default {
    
    connect:function(isReconnect){
        console.error(this);
        var _url = this.url;
        if (isReconnect) {
          _url = this.reconnUrl;
        }

        var ws = new WebSocket(_url);
        this.ws = ws
    
        ws.binaryType = this.binaryType; // 'arraybuffer'; // 'blob' or 'arraybuffer';//arraybuffer是字节
        var self = this
        ws.onopen = function (event) {
          self.handler.onopen.call(self.handler, event, ws)
          self.lastInteractionTime(new Date().getTime())
    
          self.pingIntervalId = setInterval(function () {
            self.ping(self)
          }, self.heartbeatSendInterval)
        }
        ws.onmessage = function (event) {
          self.handler.onmessage.call(self.handler, event, ws)
          self.lastInteractionTime(new Date().getTime())
        }
        ws.onclose = function (event) {
          clearInterval(self.pingIntervalId) // clear send heartbeat task
    
          try {
            self.handler.onclose.call(self.handler, event, ws)
          } catch (error) {}
    
          self.reconn(event)
        }
        ws.onerror = function (event) {
          self.handler.onerror.call(self.handler, event, ws)
        }
    
        return ws
    },
    reconn:function(event){
        var self = this
        setTimeout(function () {
            var ws = self.connect(true)
            self.ws = ws
        }, self.reconnInterval)
    },
    ping:function(){
        var iv = new Date().getTime() - this.lastInteractionTime(); // 已经多久没发消息了
        // 单位：秒
        if ((this.heartbeatSendInterval + iv) >= this.heartbeatTimeout) {
          this.handler.ping(this.ws)
        }
    },
    /**
     * @param {*} ws_protocol wss or ws 
     * @param {*} ip 
     * @param {*} port 
     * @param {*} paramStr 加在ws url后面的请求参数，形如：name=张三&id=12
     * @param {*} token
     * @param {*} handler 
     * @param {*} heartbeatTimeout 心跳时间 单位：毫秒
     * @param {*} reconnInterval 重连间隔时间 单位：毫秒
     * @param {*} binaryType 'blob' or 'arraybuffer';//arraybuffer是字节
     */
    init:function(ws_protocol, ip, port, paramStr,handler, heartbeatTimeout, reconnInterval, binaryType){
        this.ip = ip
        this.port = port
        this.url = ws_protocol + '://' + ip + ':' + port+"/chain"
        this.binaryType = binaryType || 'arraybuffer'
    
        if (paramStr) {
            this.url += '?' + paramStr
            this.reconnUrl = this.url + "&"
        } else {
            this.reconnUrl = this.url + "?"
        }
        this.reconnUrl += "tiows_reconnect=true";
     
    
        this.handler = handler
        this.heartbeatTimeout = heartbeatTimeout
        this.reconnInterval = reconnInterval
    
        this.lastInteractionTime = function () {
            if (arguments.length == 1) {
            this.lastInteractionTimeValue = arguments[0]
            }
            return this.lastInteractionTimeValue
        }
    
        this.heartbeatSendInterval = heartbeatTimeout / 2
    }
}

